20180826 Pandas 證交所個股日成交資訊
前面章節有介紹Pandas可以直接抓取html的資料。
所以這邊有一個簡單的實作,
我們要"抓取2018年台積電的日成交資訊"做成一個table。
首先我們到證交所個股成交資訊的頁面,
隨便挑個月份查詢台積電(2330),按下"列印/HTML"的連結,
個股單月資訊的網址如下:
http://www.twse.com.tw/exchangeReport/STOCK_DAY?response=html&date=20180826&stockNo=2330
我們會發現網址中中"date="和"stockNo="都是有規則的,
我們只要改變這兩組數字,就可以爬取想要的月分和個股的資料拉。
#導入模組 Pandas和內部的datetime模塊
import pandas as pd
from datetime import datetime
#我們先用datetime的功能把現在時間的月份取出來
date = datetime.now() #Output: 2018-08-26 23:43:26.897512
month = int(int(str(date)[5:7])) #Output: 8
#有時候月初還沒有資料
day = int(int(str(date)[8:10]))
if day<=4:
month= month-1
#將台積電的股市代碼設定為stockno這個變數
#stockno= input('請輸入股票代碼: ') #也可以使用input的方式來替代
stockno = 2330
#我們建立一個空的DataFrame
table = pd.DataFrame()
#開始用迴圈爬取資料,從1月(m=1)開始到目前月份
m=1
while m<=month:
#以pd.read_html這個方法,來抓資料丟到df這個變數裡 (使用到date=和stockNo=兩組數字)
#最後面的[0]是因為pd.read_html出來是一組list,我們取第一項。
df = pd.read_html('http://www.twse.com.tw/exchangeReport/STOCK_DAY?response=html&date=20180'+str(m)+'01&stockNo='+str(stockno))[0]
#將每一組的欄位名稱固定成下面的名字 (方便合併每次的資料)
df.columns=['日期','成交股數','成交金額','開盤價','最高價','最低價','收盤價','漲跌價差','成交筆數']
#使用pd.concat來做垂直合併資料,#imgore_index=True來讓最左欄的index連續,否則每個月分的index會重來。
table = pd.concat([table,df],ignore_index=True)
m += 1
table
結果就會像下面這樣啦,是不是超簡單!(此時還可以用前章節的輸出做回測拉)
[同場加映]用matplot畫台積電日期與收盤價的chart
首先要安裝Matplotlib,最老牌的python視覺化模組。 (pip3 install matplotlib)
接著因為我們希望將日期當x軸,但matplot只吃datatype為datetime的資料,
所以我們用到pd.to_datetime這個方法,
把"日期"這個欄位的資料型態做轉換(dtype: object-> datetime64(ns)),
接著我們就可以取收盤價與日期的Series,把它畫出來拉。
#導入模組
import matplotlib.pyplot as plt
#將"日期"這個欄位的資料型態從oject轉成datetime。
#pd.to_date這個方法只支援西元年,先用df.str.replace將107年取代成2018年。
table['日期'] = pd.to_datetime(table['日期'].str.replace('107','2018'))
#取一組日期對收盤加的Series
ts = pd.Series(table['收盤價'].values, index=table['日期'])
#用plot這個方法來畫圖
ts.plot()
plt.show()
大功告成! (matplot顯示中文會有亂碼問題,網路上有一些資料可以查怎麼解決)